new Vue({
    el:"#app",
    data:{
        letter:['a','b','c','d','e','f','g','h'],
        number:[8,7,6,5,4,3,2,1],
        list:[],//bg,color,code,icon
        //          1 2 3  4 5 6 
        //按重要性： 兵马象 车后王
        icon:[
            "",
            ["","♙","♘","♗","♖",'♕','♔'],
            ["","♟","♞",'♝','♜','♛','♚'],
        ],  
        ready_i:-1,
        can_run:[],
        color:1,//1白棋走，2黑棋走
        status:0,
        msg:"",
        now:-1,//最后走的棋子
        mode:1,//1 人机对战，2人人对战
        auto_timer:0,
        step:[],//每一步记录list和color,list不能是引用类型
    },
    created(){
        this.init();
    },
    methods:{
        start(){
            this.status=1;
            this.ready_i=-1;
            this.can_run=[]
            this.color=1//1白棋走，2黑棋走
            this.msg=""
            this.now=-1//最后走的棋子
            this.init();
            //自动走
            this.ai_run(1);
        },
        auto(){
            if(this.status!=1){
                this.start();
            }
            this.mode=1;
            clearInterval(this.auto_timer);
            this.auto_timer=setInterval(()=>{
                if(this.status==1&&this.color==2){
                    this.ai_run(2);
                }
                if(this.status!=1){
                    clearInterval(this.auto_timer);
                }
            },1000)
        },
        stop_auto(){
            clearInterval(this.auto_timer);
        },
        init(){ 
            var bg=0;
            var line=[4,2,3,6,5,3,2,4];
            var color="";
            var code=0;
            this.list=[];
            for(var i=0;i<64;i++){
                if(i%8>0){
                    bg=bg==1?0:1;
                }
                if(i<16){
                    color=1;
                }else if(i>=48){
                    color=2;
                }else{
                    color=0;
                }
                if(Math.floor(i/8)==0){
                    code=line[i];
                }else if(Math.floor(i/8)==1||Math.floor(i/8)==6){
                    code=1;
                }else if(Math.floor(i/8)==7){
                    code=line[i%8];
                }else{
                    code=0;
                }
                this.list.push({
                     bg,
                     color,
                     code,
                     icon:this.get_icon(color,code),
                });
            }
        },
        get_icon(color,code){
            if(color>0&&code>0){
                return this.icon[color][code];
            }
            return "";
        },
        run(i,v){
            if(v.color==this.color){
                this.ready(i,v);
            }else{
                this.do_run(i,v);
            }
        },
        is_queen(v,i){
            if(v.code!=1) return false;
            if(v.color==1&&i>55){
                return true;
            }else if(v.color==2&&i<8){
                return true;
            }
            return false;
        },
        prev_step(){
            var step=this.mode==1?2:1;
            for(var i=0;i<step;i++){
                var item=this.step[this.step.length-1];
                this.list=item.list;
                this.color=item.color;
                this.step.pop();
                this.now=-1;
                this.ready_i=-1;
                this.can_run=[];
            }
        },
        do_run(i,v){
            if(!fun.in_array(i,this.can_run)){
                return;
            }
            
            var old=fun.copy(this.list[i]);//目的地
            var item=this.list[this.ready_i];//要移动的棋子
            //记录历史
            this.step.push({
                color:this.color,
                list:fun.copy(this.list),
                from:this.ready_i,
                to:i,
                code:item.code,
            })

            console.log("run",this.ready_i+" => "+i);
            // console.log("step",this.step);
            v.color=item.color;
            v.code=item.code;
            v.icon=item.icon;
            if(this.is_queen(v,i)){
                v.code=5;
                v.icon=this.get_icon(v.color,v.code);
            }
            this.list.splice(i,1,v);
            item.color=0;
            item.code=0;
            item.icon="";
            this.list.splice(this.ready_i,1,item);
            this.color=this.color==1?2:1;
            this.ready_i=-1;
            this.can_run=[];
            this.now=i;
            // console.log("old",old,v)
            if(old.code==6&&old.color!=v.color){
                 this.finish();
                 return;
            }
            if(this.is_checking()){
                var king=this.get_king_index(this.color);
                var color2=this.color==1?2:1;
                var control=this.get_can_run_all(color2,true);
                if(this.is_dead(king,control)){
                    this.finish();
                }
            }else{
                this.msg="";
            }  
            if(this.status==1&&this.color==1){
                setTimeout(()=>{
                    this.ai_run(1);
                },500)
            }
        },
        is_checking(){
            var color2=this.color==1?2:1;
            var king=this.get_king_index(this.color);
            var control=this.get_can_run_all(color2,true);
            return fun.in_array(king,control);   
        },
        is_dead(king,control){
            //还能不能逃？
            var king_can_run=this.get_can_run(king,this.list[king]);
            if(king_can_run.length>0&&!fun.array_in_array(king_can_run,control)){
                console.log("将军：我能逃");
                return false;
            }
            //能不能挡
            if(this.can_protect_king(king)){
                console.log("将军：我能挡");
                return false;
            } 
            //能不能吃？
            if(this.can_eat()){
                console.log("将军：我能吃");
                return false;
            }
            return true;
        },
        finish(){
            this.status=2;
            this.msg=(this.color==1?'黑':'白')+"棋胜";
            setTimeout(()=>{
                alert("游戏结束");
            })
        },
        //可挡:车，象，后
        can_protect_king(king){
            var color=this.list[king].color;
            var block=this.can_block_td(color);
            var empty_lines=this.get_all_empty_line(king);
            if(empty_lines.length!=1) return false;//如果有多条直线，是不可能用一个子去挡住的
            if(this.block_line(block,empty_lines[0])){
                return true;
            }
            return false;
        },
        get_all_empty_line(king){
            var color=this.list[king].color;
            var color2=color==1?2:1;
            var list=this.get_checking_items(color2);
           
            if(list.length==0) return [];
            var re=[];
            for(var i=0,len=list.length;i<len;i++){
                var j=list[i];
                var item=this.list[j];
                if(fun.in_array(item.code,[3,4,5])){
                    console.log("直线将",king,j)
                    var line=this.get_empty_line(king,j);
                    console.log("直线：",line);
                    if(line.length>0){
                        re.push(line);
                    }
                }
            }
            return re;
        },
        //挡住一条直线
        block_line(block,line){
            var len=block.length;
            for(var i=0;i<len;i++){
                if(fun.in_array(block[i],line)){
                    return true;
                }
            }
            return false;
        },
        //可以替王挡的位置
        can_block_td(color){
            var re=[];
            this.list.map((v,i)=>{
                if(v.color==color&&v.code!=6){
                    var block=this.get_can_run(i,v);
                    if(block.length>0){
                        re=re.concat(block);
                    }
                }
            })
            return re;
        },
        // 2 47
        get_empty_line(a,b){
            var re=[];
            var min=Math.min(a,b);
            var max=Math.max(a,b);
            var a_row=Math.floor((min+1)/8);
            var b_row=Math.floor((max+1)/8);
            var a_col=min%8;
            var b_col=max%8;
            if(a_row==b_row){
                var len=b_col-a_col-1;
                for(var i=1;i<=len;i++){
                    if(!this.list[min+i].code){
                        re.push(min+i);
                    }else{
                        re=[];
                        break;
                    }
                }
            }else if(a_col==b_col){
                var len=b_row-a_row-1;
                for(var i=1;i<=len;i++){
                    if(!this.list[min+8*i].code){
                        re.push(min+8*i);
                    }else{
                        re=[];
                        break;
                    }
                }
            }else if(b_row-a_row==b_col-a_col){
                var len=b_row-a_row-1;
                for(var i=1;i<=len;i++){
                    if(!this.list[min+9*i].code){
                        re.push(min+9*i);
                    }else{
                        re=[];
                        break;
                    }
                }
            }else if(b_row-a_row==a_col-b_col){
                var len=b_row-a_row-1;
                for(var i=1;i<=len;i++){
                    if(!this.list[min+7*i].code){
                        re.push(min+7*i);
                    }else{
                        re=[];
                        break;
                    }
                }
            }
            return re;
        },
        can_eat(){
            var color2=this.color==1?2:1;
            var checking=this.get_checking_items(color2);//获取正在将军的棋子
            if(checking.lenth>1) return false;
            var 能吃的=this.get_can_run_all(this.color);
            if(fun.in_array(checking[0],能吃的)){
                return true;
            }
            return false;
        },
        get_checking_items(color){
            var king_color=color==1?2:1;
            var king=this.get_king_index(king_color);//是否可以通过传参获得？
            var re=[];
            this.list.map((v,i)=>{
                if(v.color==color){
                    var can_run=this.get_can_run(i,v);
                    if(fun.in_array(king,can_run)){
                        re.push(i);
                    }
                }
            })
            return re;
        },
        get_king_index(color){
            for(var i=0;i<64;i++){
                let item=this.list[i];
                if(item.color==color&&item.code==6){
                    return i;
                }
            }
            return -1;
        },
        ready(i,v){
            if(!v.icon||this.status!=1) return;
            this.ready_i=i;
            this.can_run=this.get_can_run(i,v);
        },
        ai_run(color){
            if(this.mode!=1) return;
            var move=this.my_move_list(color);
            if(move.length>0){
                re=move;
            }else{
                //最后的办法
                re=this.ai_run_rand(color);
            }
            this.move(re[0],re[1]);
        },
        //TODO:目前只考虑了第一步，没考虑过走完这一步后是否会被吃掉，或者是否有其它危险！考虑下一步的话，需要把this.list改成list,不同步的环境下的list是不一样的
        my_move_list(color){
            var re=[];
            //是否正在被将军
            re=this.get_checking_move(color);
            if(re.length>0) return re;
            //有哪个棋子需要逃跑？
            re=this.is_need_escape(color);
            if(re.length>0) return re;
            //可以吃哪些棋子？
            re=this.is_can_eat(color);
            if(re.length>0) return re;
            //有哪些安全的走法？

            return [];
        },
        is_can_eat(color){
            var re=this.get_can_run_all(color,"eat");
            if(re.length==0) return [];
            re.sort((a,b)=>{
                return parseInt(b.code)-parseInt(a.code);
            })
            var item=re[0];
            return [item.from,item.to];
        },
        is_need_escape(color){
            var color2=color==1?2:1;
            var control=this.get_can_run_all(color2,true);
            var re=[];
            for(var i=0;i<64;i++){
                var item=this.list[i];
                if(item.color==color&&fun.in_array(i,control)){
                    re.push({
                        i:i,
                        code:this.list[i].code,
                    })
                }
            }
            if(re.length==0) return [];
            if(re.length>1){
               re.sort((a,b)=>{
                   return parseInt(b.code)-parseInt(a.code);
               })
            }
            var from=-1;
            var to=-1;
            var can_run=[];
            //TODO:如果有多个子需要逃跑的时候，选择了第一个可以走的子，应该是要判断一下跑哪个最有价值的
            for(var i=0,len=re.length;i<len;i++){
                var j=re[i].i;
                var _run=this.get_can_run(j,this.list[j]);
                if(_run.length>0){
                    from=j;
                    can_run=_run;
                    break;
                }
            }
            if(from==-1) return [];
            var code=0;//可吃的棋子
            can_run.map(index=>{
                if(this.list[index].code>code){
                    code=this.list.code;
                    to=index;
                }
            })
            if(to==-1){
                to=fun.array_one(can_run);
            }
            if(code>0){
                console.log("逃跑的时候顺便吃个子",code,i,"=>",to);
            }else{
                console.log("单纯逃跑",from,to,can_run);
            }
            return [from,to];
        },
        //color参数先保留，但下面很多地方直接使用了this.color
        get_checking_move(color){
            if(this.is_checking()==false) return [];
            //能吃不？
            var color2=this.color==1?2:1;
            var checking=this.get_checking_items(color2);//获取正在将军的棋子
            if(checking.lenth>1) return [];
            var to=checking[0];
            for(var i=0;i<64;i++){
                var item=this.list[i];
                if(item.color==this.color){
                    var arr=this.get_can_run(i,item);
                    if(arr.length>0&&fun.in_array(to,arr)){
                        console.log("敢将我？我吃")
                        return [i,to];
                    }
                }
            }
            //能逃吗？
            var control=this.get_can_run_all(color2,true);
            var king=this.get_king_index(this.color);
            var king_can_run=this.get_can_run(king,this.list[king]);
            if(king_can_run.length>0){
                for(var i=0,len=king_can_run.length;i<len;i++){
                    var j=king_can_run[i];
                    if(!fun.in_array(j,control)){
                        console.log("敢将我？我逃")
                        return [king,j];
                    }
                }
            }
            //能挡吗？TODO:如果有多个子可挡，是否还应该选择用哪个子去挡？要考虑棋子的大小，更复杂一点，还要考虑先后顺序！！！！
            var line=this.get_all_empty_line(king);
            if(line.length!=1) return [];
            return this.get_block_move(color,line);
        },
        get_block_move(color,line){
            for(var i=0;i<64;i++){
                if(this.list[i].color==color){
                    var run=this.get_can_run(i,this.list[i]);
                    if(run.length>0){
                        for(var j=0,len=run.length;j<len;j++){
                            if(fun.in_array(run[j],line)){
                                return [i,run[j]];
                            }
                        }
                    }
                }
            }
            return [];
        },
        move(from,to){
            this.ready(from,this.list[from]);
            this.do_run(to,this.list[to]);
        },
        ai_run_rand(color){
            var all=this.get_all_qz(color);
            var can_run=[];
            var from =-1;
            var to=-1;
            while(can_run.length==0){
                var i=fun.array_one(all);
                var v=this.list[i];
                can_run=this.get_can_run(i,v);
                if(can_run.length>0){
                    from=i;
                }
            }
            to=fun.array_one(can_run);
            return [from,to];
        },
        get_all_qz(color){
            var re=[];
            this.list.map((v,i)=>{
                if(v.color==color){
                    re.push(i);
                }
            })
            return re;
        },
        get_can_run_all(color,is_control){
            var control=[];
            for(var i=0;i<64;i++){
                let item=this.list[i];
                if(item.code&&item.color==color){
                    let tmp=this.get_can_run(i,item,is_control);
                    if(tmp.length>0){
                        if(is_control=="eat"){
                            tmp.map(v=>{
                                control.push({
                                    from:i,
                                    to:v,
                                    mycode:item.code,
                                    code:this.list[v].code,
                                })
                            })
                        }else{
                            control=control.concat(tmp);
                        }
                    }
                }
            }
            return control;
        },
        get_can_run(i,v,is_control){
            var run=[];
            var row=Math.ceil((i+1)/8);
            var col=i%8+1;
            //兵
            if(v.code==1){
                if(v.color==1){
                    if(is_control){
                        run.push(i+7);
                        run.push(i+9);
                    }else{
                        if(row==2){
                            if(!this.list[i+8].code){
                                run.push(i+8);
                                if(!this.list[i+16].code){
                                    run.push(i+16);
                                }
                            }
                        }
                        if(col>1&&this.list[i+7].color==2){
                            run.push(i+7);
                        }
                        if(col<8&&this.list[i+9].color==2){
                            run.push(i+9);
                        }
                        if(!this.list[i+8].code){
                            run.push(i+8);
                        }  
                    }
                }else{
                    if(is_control){
                        run.push(i-7);
                        run.push(i-9);
                    }else{
                        if(row==7){
                            if(!this.list[i-8].code){
                                run.push(i-8);
                                if(!this.list[i-16].code){
                                    run.push(i-16);
                                }
                            }
                        }
                        if(col<8&&this.list[i-7].color==1){
                            run.push(i-7);
                        }
                        if(col>1&&this.list[i-9].color==1){
                            run.push(i-9);
                        }
                        if(!this.list[i-8].code){
                            run.push(i-8);
                        } 
                    }
                }
                //马
            }else if(v.code==2){
                //八个位置
                //左上横
                if(row>1&&col>2){
                    run.push(i-10);
                }
                //左上竖
                if(row>2&&col>1){
                    run.push(i-17);
                }
                //右上横
                if(row>1&&col<7){
                    run.push(i-6);
                }
                //右上竖
                if(row>2&&col<8){
                    run.push(i-15);
                }
                //左下横
                if(row<8&&col>2){
                    run.push(i+6);
                }
                //左下竖
                if(row<7&&col>1){
                    run.push(i+15);
                }
                //右下横
                if(row<8&&col<7){
                    run.push(i+10);
                }
                //右下竖
                if(row<7&&col<8){
                    run.push(i+17);
                }
            }
            //车或后
            if(v.code==4||v.code==5){
                var left=i%8;
                for(var j=1;j<=left;j++){
                    run.push(i-j);
                    if(this.list[i-j].code) break;
                }
                var right=7-left;
                for(var j=1;j<=right;j++){
                    run.push(i+j);
                    if(this.list[i+j].code) break;
                }
                var top=Math.floor(i/8);
                for(var j=1;j<=top;j++){
                    run.push(i-j*8);
                    if(this.list[i-j*8].code) break;
                }
                var bottom=7-top;
                for(var j=1;j<=bottom;j++){
                    run.push(i+j*8);
                    if(this.list[i+j*8].code) break;
                } 
            }
             //象
            if(v.code==3||v.code==5){
                //左上
                var len=row>col?col:row;
                for(var j=1;j<=len-1;j++){
                    run.push(i-9*j);
                    if(this.list[i-9*j].code) break;
                }
                //左下
                var len=(col-1)<(8-row)?(col-1):(8-row);
                for(var j=1;j<=len;j++){
                    run.push(i+7*j);
                    if(this.list[i+7*j].code) break;
                }
                //右上
                var len=(row-1)<(8-col)?(row-1):(8-col);
                for(var j=1;j<=len;j++){
                    run.push(i-7*j);
                    if(this.list[i-7*j].code) break;
                }
                //右下
                var len=(8-row)<(8-col)?(8-row):(8-col);
                // console.log("len",len)
                for(var j=1;j<len;j++){
                    run.push(i+9*j);
                    if(this.list[i+9*j].code) break;
                }
            } 
            if(v.code==6){
                if(col>1){
                    run.push(i-1);
                    if(row>1){
                        run.push(i-9);
                    }
                    if(row<8){
                        run.push(i+7);
                    }
                }
                if(col<8){
                    run.push(i+1);
                    if(row>1){
                        run.push(i-7);
                    }
                    if(row<8){
                        run.push(i+9);
                    }
                }
                if(row>1){
                    run.push(i-8);
                }
                if(row<8){
                    run.push(i+8);;
                }
            }
            return this.check_run(run,v,is_control);
        },
        check_run(run,v,is_control){
            var re=[];
            run.map(i=>{
                var item=this.list[i];
                if(i>=0&&i<=63){
                    //能吃的
                    if(is_control=="eat"){
                        // console.log("is_control",is_control)
                        if(item.color&&item.color!=v.color){
                            re.push(i);
                        }
                    //在控制范围内的，包括自己的棋子
                    }else if(is_control){
                        // console.log("is_control",is_control)
                        re.push(i);
                    //能走的地方，只要不是自己的棋子就可以
                    }else if(item.color!=v.color){
                        re.push(i);
                    }
                }
            })
            return re;
        }

    }
})